//树形dp - 没有上司的舞会
#include <iostream>
#include <vector>
using namespace std;
const int N = 6e3 + 10;
int r[N];
int n;

int f[N]; //f[i]表示以i为根的树, 选根节点时, 最大快乐指数
int g[N]; //g[i]表示以i为根的树, 不选根节点时, 最大快乐指数

vector<int> edges[N];
bool st[N]; //找根

void dfs(int x)
{
    f[x] = r[x];
    for(auto& y : edges[x])
    {
        dfs(y);
        f[x] += g[y];
        g[x] += max(f[y], g[y]);
    }   
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> r[i];
    for(int i = 1; i < n; i++)
    {
        int k, l; cin >> l >> k;
        edges[k].push_back(l);
        st[l] = true;
    }
    int r;
    for(int i = 1; i <= n; i++)
        if(!st[i]) r = i;
    dfs(r);
    cout << max(f[r], g[r]) << endl;
    return 0;
}